/**
 * 文件名：@StreamView.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.springmvc.view <br/>
 * 项目名：afw-mvc-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.springmvc.view;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.view.AbstractView;

import cn.efunbox.afw.web.util.AfwWebConstant;

/**
 * 类名：StreamView  <br />
 *
 * 功能：流视图
 *
 * @author xtwin <br />
 * 创建时间：2015年12月3日 下午6:14:52  <br />
 * @version 2015年12月3日
 */
public class StreamView extends AbstractView {
	
	// 内容字段
	protected String contentName = AfwWebConstant.KEY_STREAM_IN_CONTEXT;
	
	// 缓存大小
	protected int bufferSize = 1024;
	
	/**
	 * 构造方法
	 */
	public StreamView() {
		setContentType("text/plain");
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月3日 下午6:15:05<br/>
	 * 
	 * @param model
	 * @param request
	 * @param response
	 * @throws Exception <br/>
	 * @see org.springframework.web.servlet.view.AbstractView#renderMergedOutputModel(java.util.Map, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
		if (null != model) {
			Object content = model.get(contentName);
			
			if (content instanceof String || content instanceof byte[]) {
				PrintWriter out = response.getWriter();
				out.print(content);
				out.flush();
			} else if (content instanceof InputStream) {
				
				InputStream is = null;
				OutputStream os = null;
				
				try {
					is = (InputStream) content;
					
					os = response.getOutputStream();
					
					byte[] buf = new byte[bufferSize];
					
					while (true) {
						int len = is.read(buf);
						
						if (len == -1) {
							break;
						}
						
						os.write(buf, 0, len);
					}
				} finally {
					if (null != os) {
						os.close();
					}
					
					if (null != is) {
						is.close();
					}
				}
			}
		}
	}

	/**
	 * @version 2015年12月3日-下午6:16:47
	 */
	public void setContentName(String contentName) {
		this.contentName = contentName;
	}

	/**
	 * @version 2015年12月3日-下午6:16:47
	 */
	public void setBufferSize(int bufferSize) {
		this.bufferSize = bufferSize;
	}
}
